void delay(uint32_t time)
{
	while(time--);
}

#define RCC_BASE_ADDR		0x40023800U
#define RCC_AHB1EN			*((volatile uint32_t*)(RCC_BASE_ADDR + 0x30))
	
#define GPIOE_BASE_ADDR		0x40021000U
#define GPIOE_MODER			*((volatile uint32_t*)(GPIOE_BASE_ADDR + 0x00))
#define GPIOE_OTYPER		*((volatile uint32_t*)(GPIOE_BASE_ADDR + 0x04))
#define GPIOE_OSPEEDR		*((volatile uint32_t*)(GPIOE_BASE_ADDR + 0x08))
#define GPIOE_PUPDR			*((volatile uint32_t*)(GPIOE_BASE_ADDR + 0x0C))
#define GPIOE_IDR			*((volatile uint32_t*)(GPIOE_BASE_ADDR + 0x10))	
#define GPIOE_ODR			*((volatile uint32_t*)(GPIOE_BASE_ADDR + 0x14))	
	

#define GPIOB_BASE_ADDR		0x40020400U
#define GPIOB_MODER			*((volatile uint32_t*)(GPIOB_BASE_ADDR + 0x00))
#define GPIOB_OTYPER		*((volatile uint32_t*)(GPIOB_BASE_ADDR + 0x04))
#define GPIOB_OSPEEDR		*((volatile uint32_t*)(GPIOB_BASE_ADDR + 0x08))
#define GPIOB_ODR			*((volatile uint32_t*)(GPIOB_BASE_ADDR + 0x14))

int main()
{
	while(1)
	{
		RCC_AHB1EN &= ~(1 << 4); 
		RCC_AHB1EN |= (1 << 4);

		GPIOE_MODER &= ~(0x01 << 8*2);
		GPIOE_MODER |= (0x01 << 8*2);
		GPIOE_MODER &= ~(0x01 << 9*2);
		GPIOE_MODER |= (0x01 << 9*2);
		GPIOE_MODER &= ~(0x01 << 10*2);
		GPIOE_MODER |= (0x01 << 10*2);
		GPIOE_OTYPER = 0x00000000;
		GPIOE_OSPEEDR = 0x00000000;
		
		// 熄灭 LED1~3
		GPIOE_ODR |= (1<<8);
		GPIOE_ODR |= (1<<9);
		GPIOE_ODR |= (1<<10);
		
		
		// 点亮 LED1~3
//		GPIOE_ODR &= ~(1<<8);
//		GPIOE_ODR &= ~(1<<9);
//		GPIOE_ODR &= ~(1<<10);

		// 蜂鸣器
		// 使能 GPIOB 时钟
		RCC_AHB1EN &= ~(1 << 1); 
		RCC_AHB1EN |= (1 << 1);
		// GPIO 输入输出选择：输出
		GPIOB_MODER &= ~(0x03 << 10*2);
		GPIOB_MODER |= (0x01 << 10*2);
		
		// 配置 GPIO 工作模式：推挽输出
		GPIOE_OTYPER &= ~(1 << 10);
		
		// 配置 GPIO 输出速度：
		GPIOB_OSPEEDR &= ~(0x03 << 10*2);
		
		// 配置 GPIO 输出电平：
		GPIOB_ODR &= ~(1 << 10); 	// 关闭蜂鸣器
//		GPIOB_ODR |= (1 << 10);		// 开启蜂鸣器
	
		// 按键
		// 使能 GPIOE 时钟
//		RCC_AHB1EN &= ~(1 << 4); 
//		RCC_AHB1EN |= (1 << 4);
		// GPIO 输入输出选择：输入
		GPIOB_MODER &= ~(3 << 4*2);
		// 配置 GPIO 工作模式：上拉输入
		GPIOE_PUPDR &= ~(2 << 4*2);
		GPIOE_PUPDR |= (1 << 4*2);
		
		if ((GPIOE_IDR & 0x10) == 0)
		{
			delay(1000);	// 延时消抖
			if ((GPIOE_IDR & 0x10) == 0)
			{
//				while(1)
//				{
					GPIOB_ODR |= (1 << 10);		// 开启蜂鸣器
					GPIOE_ODR &= ~(1<<8);		// 点亮 LED1 
//				}	
//				while(1)
//				{
//					GPIOB_ODR |= (1 << 10);		// 开启蜂鸣器
//					delay(100000);
//					GPIOB_ODR &= ~(1 << 10);	// 关闭蜂鸣器
//					delay(100000);
//				}
			}
		}
	} 
}